package thread.wang_bao_ling.c01;

/**
 * 指令重排问题演示
 *
 * 在new操作上，我们以为的new操作应该是：
 *    分配一块内存M；
 *    在内存M上初始化Singleton对象；
 *    然后M的地址赋值给instance变量。
 * 但是实际上优化后的执行路径却可能这样的：
 *    分配一块内存M；
 *    将M的地址赋值给instance变量；
 *    最后在内存M上初始化Singleton对象。
 * 这样的话线程1执行到@1处还在实例化Singleton对象就将地址赋值给instance变量了
 * 此时如果刚好有线程2执行到了@2处会发现instance不为空而直接返回，其实此时Singleton对象还未实例化完，是有问题的
 *
 */
public class Singleton {
    static  Singleton  instance;
    static  Singleton getInstance(){
        if (instance == null) {//@2
            synchronized(Singleton.class) {
                if (instance == null)
                    instance = new Singleton();//@1
            }
        }
        return instance;
    }
}
